#include "Pwm.h"
#include "stm32f10x.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_gpio.h"
#include "misc.h"


void pwm_init(void){

    // 因为 tim2 是 通用时钟，其连接到了 APB1 上
    // 这里为其使能时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    // 配置 tim2 使用内部时钟
    TIM_InternalClockConfig(TIM2);
    
    /*
    2024/1/10 09:57:30

        TIM_ETRClockMode1Config和TIM_ETRClockMode2Config是在STM32的定时器（TIM）模块中使用的两种配置模式，用于设置外部时钟源（ETR）的工作方式。它们的区别在于以下几点：

        功能：

        TIM_ETRClockMode1Config：该配置模式用于将ETR设置为外部时钟源，并选择计数器的上升沿、下降沿或双边沿触发。
        TIM_ETRClockMode2Config：该配置模式用于将ETR设置为外部时钟源，并选择计数器的上升沿触发。
        触发方式：

        TIM_ETRClockMode1Config：该模式可以选择计数器在上升沿触发、下降沿触发或双边沿触发时增加。
        TIM_ETRClockMode2Config：该模式只能选择计数器在上升沿触发时增加。
            
            因为 TIM2 的外部时钟输入默认是复用到 PA0 上，
            所以方波输入直接接  PA0即可
            
            因为错误的配置GPIO引脚可能会导致输入被上拉或者下拉
            导致输入紊乱
            所以要配置GPIO
    */
    
    GPIO_Init(GPIOA,&(GPIO_InitTypeDef){
        .GPIO_Pin=GPIO_Pin_0,
        // 配置为使用Pwm作为输出
        .GPIO_Mode=GPIO_Mode_AF_PP,
        .GPIO_Speed=GPIO_Speed_50MHz
    });
    
    
  
    
    
    
    // 1.配置预分频器
    // 因为要求对方波的上升沿数量进行计次
    // 所以不需要分频，如果配置了分频，那么就相当于把外部输入的方波进行分频之后
    // 再进行后续处理
    TIM_PrescalerConfig(TIM2,72-1,TIM_PSCReloadMode_Update);
    
    // 2.配置计数器的计数模式
    // 从 0 往上数，直到特定数字
    TIM_CounterModeConfig(TIM2,TIM_CounterMode_Up);
    
    // 3.设置自动重装寄存器的值
    TIM_SetAutoreload(TIM2,20000-1);
    
    // 配置时基单元
    // 这里一行相当于上面的1-3步骤所做的事情
    //TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
    //TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
/*    TIM_TimeBaseInit(TIM2,&(TIM_TimeBaseInitTypeDef){
        // 配置预分频
        .TIM_ClockDivision = TIM_CKD_DIV1,
        // 把 72MHz 的频率分为 72MHz/10000 = 7200Hz
        .TIM_Prescaler = 10000-1,
        // 配置自动重装寄存器
        // 当计数达到 7200 时，触发后续中断
        .TIM_Period = 7200-1,
        
        // 从 0 往上数，直到特定数字
        .TIM_CounterMode = TIM_CounterMode_Up,
        .TIM_RepetitionCounter = 0x0000,
    });
*/    
    
    
    
    
    TIM_OCInitTypeDef tim_init = {
        .TIM_OCMode = TIM_OCMode_PWM1,
        .TIM_OutputState = TIM_OutputState_Enable,
        .TIM_Pulse = 500,
        .TIM_OCPolarity = TIM_OCPolarity_High
    };
    TIM_OC1Init(TIM2,&tim_init);
    
    // 启动定时器
    TIM_Cmd(TIM2,ENABLE);
}

int16_t setPulse(int16_t pulse){
    
    // 设置占空比
    TIM_SetCompare1(TIM2,pulse);
    
    return pulse;
}

int16_t increasePulse(int16_t pulse){
    pulse+=1000;
    if(pulse>20000){
        pulse = 20000;
    }
    return setPulse(pulse);
}   
int16_t reducePulse(int16_t pulse){
    pulse-=1000;
    if(pulse<=0){
        pulse=0;
    }
    return setPulse(pulse);
}


